//package com.guilin.interceptor;
//
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.guilin.annotation.IgnoreAuth;
//import com.guilin.common.constant.Constants;
//import com.guilin.common.core.domain.AjaxResult;
//import com.guilin.common.utils.StringUtils;
//import com.guilin.system.service.QQToKenService;
//import io.jsonwebtoken.Claims;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//import org.springframework.web.method.HandlerMethod;
//import org.springframework.web.servlet.HandlerInterceptor;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.PrintWriter;
//
///**
// * jwt令牌校验的拦截器
// */
//@Component
//@Slf4j
//public class JwtTokenAlumniInterceptor implements HandlerInterceptor {
//
//    @Autowired
//    private QQToKenService qqtoKenService;
//
//    // 令牌自定义标识
//    @Value("${token.header}")
//    private String header;
//
//
//    /**
//     * 校验jwt
//     *
//     * @param request
//     * @param response
//     * @param handler
//     * @return
//     * @throws Exception
//     */
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
//
//        // 跨域支持
//        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
//        response.setHeader("Access-Control-Max-Age", "3600");
//        response.setHeader("Access-Control-Allow-Credentials", "true");
//        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source," + header + ", Origin, Content-Type, Cookie, Accept, authorization");
//        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
//
//
//        // 1. 检查是否为方法请求
//        if (!(handler instanceof HandlerMethod)) {
//            return true; // 如果不是方法请求，直接放行
//        }
//
//        // 2. 检查是否存在@IgnoreAuth注解
//        HandlerMethod handlerMethod = (HandlerMethod) handler;
//        if (handlerMethod.getMethodAnnotation(IgnoreAuth.class) != null) {
//            return true; // 放行忽略验证的方法
//        }
//
//        //3.从请求头中获取token
//        String tokenHeader = request.getHeader(header);
//
//        //4.校验token是否存在
//        if (tokenHeader == null || StringUtils.isEmpty(tokenHeader)) {
//            sendErrorResponse(response, "未提供有效的 JWT 令牌");
//            return false;
//        }
//
//        //5. 提取真正的token（去除前缀）
//        String token = null;
//        if (tokenHeader.startsWith(Constants.TOKEN_PREFIX)) {
//            token = tokenHeader.replace(Constants.TOKEN_PREFIX, "");
//        } else {
//            token = tokenHeader;
//        }
//
//        //6. 验证token是否有效
//        if (StringUtils.isEmpty(token) || !qqtoKenService.verifyToken(token)) {
//            sendErrorResponse(response, "无效的 JWT 令牌");
//
//            return false;
//        }
//
//        // 存储用户信息到会话
//        Claims claims = qqtoKenService.parseToken(token);
//        request.getSession().setAttribute("alumniId", claims.get(Constants.ALUMNI_ID));
//        request.getSession().setAttribute("alumniName", claims.get(Constants.ALUMNI_NAME));
//        request.getSession().setAttribute("alumniRole", claims.get(Constants.ALUMNI_ROLE));
//
//        // 7. 验证通过，放行请求
//        return true;
//
//    }
//
//    /**
//     * 发送错误响应
//     *
//     * @param response 响应对象
//     * @param message  错误消息
//     * @throws Exception
//     */
//    private void sendErrorResponse(HttpServletResponse response, String message) throws Exception {
//        // 设置响应的内容类型为 JSON 格式，并指定字符编码为 UTF-8
//        response.setContentType("application/json;charset=UTF-8");
//        // 设置响应的 HTTP 状态码为 401，表示未授权
//        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
//        // 获取响应的输出流，用于向客户端发送数据
//        PrintWriter out = response.getWriter();
//        // 创建一个 ObjectMapper 对象，用于将 Java 对象转换为 JSON 字符串
//        ObjectMapper objectMapper = new ObjectMapper();
//        // 创建一个 AjaxResult 对象，将错误信息封装进去
//        AjaxResult errorResult = AjaxResult.error(HttpServletResponse.SC_UNAUTHORIZED, "请先登录: " + message);
//        // 将 AjaxResult 对象转换为 JSON 字符串，并写入响应输出流
//        out.write(objectMapper.writeValueAsString(errorResult));
//        // 刷新输出流，确保数据被发送到客户端
//        out.flush();
//        // 关闭输出流
//        out.close();
//    }
//}
